package com.qf.cdmmybatisspringbootstarter.config;

import com.alibaba.druid.pool.DruidDataSource;
import org.mybatis.spring.SqlSessionFactoryBean;
import org.mybatis.spring.mapper.MapperScannerConfigurer;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.context.properties.EnableConfigurationProperties;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import javax.sql.DataSource;

/**
 * 起步器就是一个依赖，我们引入这个依赖就可以使用我们需要的核心功能：
 *   ① 我们起步器依赖中一定会存在一个AutoConfiguration
 *   ② 在AutoConfiguration类中会存在很多@Bean的方法，来注入操作需要用到的核心对象
 *   ③ 我们在注入这些核心对象时，需要用户配置的信息，会封装成一个XxxProperties配置类
 *   ④ 要保障这个AutoConfiguration在依赖引入时，一定能够被正常加载，采用的是springboot的spi机制
 *              springboot程序启动时，会基于@EnableAutoConfiguration去加载类路径下MATE-INF/spring.factories文件中
 *               键为org.springframework.boot.autoconfigure.EnableAutoConfiguration的值
 *   ⑤ 另外我们在注入Bean对象时，可以通过条件控制来选择性注入
 */
@Configuration
@EnableConfigurationProperties(DataSourceProperties.class)
public class MyBatisAutoConfiguration {

    @Autowired
    private DataSourceProperties dsp;

    @Bean
    public DataSource getDs(){
        DruidDataSource dataSource = new DruidDataSource();
        //数据库的四个连接信息应该是使用当前起步器依赖的一方去配置。而作为定义起步器的一方，应该是去读取配置信息
        dataSource.setDriverClassName(dsp.getDriver());
        dataSource.setUrl(dsp.getUrl());
        dataSource.setUsername(dsp.getUsername());
        dataSource.setPassword(dsp.getPassword());
        return dataSource;
    }

    @Bean
    public SqlSessionFactoryBean ssfb(DataSource ds){
        SqlSessionFactoryBean ssfb = new SqlSessionFactoryBean();
        ssfb.setDataSource(ds);
        return ssfb;
    }

//    @Bean
//    public static MapperScannerConfigurer msc(){
//        MapperScannerConfigurer msc = new MapperScannerConfigurer();
//        msc.setBasePackage(dsp.getBasePackage());
//        return msc;
//    }
}
